
/*definição da estrutura de casos de teste*/
typedef struct {
	int numMusicas;
	int volumeInicial;
	int volumeLimite;

	int *variacoes;
} ItemCasoTeste;

typedef struct _casoTeste
{
	ItemCasoTeste itemCasoTeste;
	struct _casoTeste *prox;

} CasoTeste;

typedef CasoTeste *PCasoTeste;

typedef struct {
	PCasoTeste Primeiro, Ultimo;
} ListaCasos;

/*fim da definição da estrutura*/

long potencia(long b, long e);

void criarArvoreSolucoes(int *arvore, long posicao, int numNiveis, int nivel, int inicio, int *variacoes);

int verificarCaminho(int *arvore, int indice, int limite);

void obterCaminhosValidos(int *arvore, int *final, int numItens, int inicioUltimoNivel, int limite);

int volumeUltimaMusicaForcaBruta(PCasoTeste casoTeste);

int volumeUltimaMusicaGuloso(PCasoTeste casoTeste);

int volumeUltimaMusicaDinamico(PCasoTeste casoTeste);

int obterMaiorCaminho(int *arvore, int *final, int inicioUltimoNivel, int numItens);

/*Metodos para manipular a lista de casos de teste*/

int isListaCasosVazia(ListaCasos L);

void criarListaCasos(ListaCasos *L);

void inserirPonteiroCasoTeste(ListaCasos *L, PCasoTeste P);

void inserirCasoTeste(ListaCasos *L, int numMusicas, int volumeInicial, int volumeLimite, int variacoes[]);

void imprimirCasosTeste(ListaCasos L);

ListaCasos *liberaCasosTeste(ListaCasos L);

/*fim dos métodos para manipular a lista de casos de teste*/


